package com.atguigu.spzx.cart.service.impl;

import com.atguigu.spzx.cart.dto.CartItemRedisQueryRespDto;
import com.atguigu.spzx.cart.entity.CartItemRedis;
import com.atguigu.spzx.cart.manager.CartManager;
import com.atguigu.spzx.cart.service.CartService;
import com.atguigu.spzx.cart.vo.CartItemRedisQueryRespVo;
import com.atguigu.spzx.common.constant.CartItemCheckedEnum;
import com.atguigu.spzx.common.utils.AuthContextUtil;
import com.atguigu.spzx.common.utils.BeanUtils;
import com.atguigu.spzx.product.dto.ProductSkuDetailRespDto;
import com.atguigu.spzx.product.feign.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * CartServiceImpl
 * </p>
 *
 * @author flyduck
 * @since 2023/11/5
 */
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private CartManager cartManager;
    @Autowired
    private ProductFeignClient productFeignClient;


    /**
     * 添加购物车
     * userId:
     *      skuId -> sku信息
     *      skuId -> sku信息
     *      skuId -> sku信息
     * @param skuId
     * @param skuNum
     */
    @Override
    public void addToCart(Long skuId, Integer skuNum) {
        Long userId = AuthContextUtil.getUserInfo().getId();
        //获取购物车的sku信息
        CartItemRedis cartItemRedis = cartManager.getCartItemRedisBySkuId(skuId);
        if (cartItemRedis != null) {
            //购物车存在商品，增加数量
            //数量添加
            cartItemRedis.setSkuNum(cartItemRedis.getSkuNum() + skuNum);
            //设置选中
            cartItemRedis.setIsChecked(CartItemCheckedEnum.CHECKED.getCode());
            //设置更新时间
            cartItemRedis.setUpdateTime(new Date());
        }else {
            //购物车没有商品，直接将商品添加到redis（需要远程调用product服务获取sku信息）
            cartItemRedis = new CartItemRedis();
            //远程调用product服务获取sku信息
            ProductSkuDetailRespDto productSkuDetailRespDto = productFeignClient.getProductSkuBySkuId(skuId);
            cartItemRedis.setCartPrice(productSkuDetailRespDto.getSalePrice());
            cartItemRedis.setSkuNum(skuNum);
            cartItemRedis.setSkuId(skuId);
            cartItemRedis.setUserId(userId);
            cartItemRedis.setImgUrl(productSkuDetailRespDto.getThumbImg());
            cartItemRedis.setSkuName(productSkuDetailRespDto.getSkuName());
            cartItemRedis.setIsChecked(CartItemCheckedEnum.CHECKED.getCode());
            cartItemRedis.setCreateTime(new Date());
            cartItemRedis.setUpdateTime(new Date());
        }
        //将保存或者修改的结果保存到redis
        cartManager.saveCartItemRedis(skuId, cartItemRedis);
    }

    /**
     * 查询购物车列表
     * @return
     */
    @Override
    public List<CartItemRedisQueryRespVo> getCartItemList() {
        List<CartItemRedis> cartItemRedisList = cartManager.getCartItemList();
        return BeanUtils.toBeanList(cartItemRedisList, CartItemRedisQueryRespVo.class);
    }

    /**
     * 删除购物车商品
     * @param skuId
     */
    @Override
    public void deleteCartItemBySkuId(Long skuId) {
        cartManager.deleteCartItemBySkuId(skuId);
    }

    /**
     * 更新购物车商品选中状态
     * @param skuId
     * @param isChecked
     */
    @Override
    public void checkCart(Long skuId, Integer isChecked) {
        cartManager.updateIsCheckedBySkuId(skuId,isChecked);
    }

    /**
     * 更新购物车商品全部选中状态
     * @param isChecked
     */
    @Override
    public void allCheckCart(Integer isChecked) {
        cartManager.updateIsChecked(isChecked);
    }

    /**
     * 清空购物车
     */
    @Override
    public void clearCart() {
        cartManager.deleteCart();
    }


    /**
     * 选中的购物车
     * @return
     */
    @Override
    public List<CartItemRedisQueryRespDto> getAllChecked() {
        List<CartItemRedis> cartItemRedisList = cartManager.getCartItemList().stream()
                .filter(cartItem -> CartItemCheckedEnum.CHECKED.getCode().equals(cartItem.getIsChecked()))
                .collect(Collectors.toList());
        return BeanUtils.toBeanList(cartItemRedisList,CartItemRedisQueryRespDto.class);
    }

    /**
     * 删除生成订单的购物车商品
     */
    @Override
    public void deleteChecked() {
        List<CartItemRedis> cartItemList = cartManager.getCartItemList();
        //删除选中的商品
        for (CartItemRedis cartItemRedis : cartItemList) {
            if(CartItemCheckedEnum.CHECKED.getCode().equals(cartItemRedis.getIsChecked())){
                cartManager.deleteCartItemBySkuId(cartItemRedis.getSkuId());
            }
        }
    }
}
